/**
 * 
 */
package ar.com.gepp.torneo.entidades.impl;

import java.util.ArrayList;
import java.util.List;

import ar.com.gepp.torneo.comparators.EliminatoriaClasificacionSimple;

/**
 * @author gpidote
 * 
 */
public class EliminatoriaSimple {
	Integer idEdicion;
	List<Posicion> equipos = new ArrayList<Posicion>(0);
	List<Fixture> rondas = new ArrayList<Fixture>(0);
	Integer cantRondas;
	Integer rondaJugadas;
	Integer fechaActual;

	/**
	 * 
	 * @param equipos
	 * @param idavuelta
	 * @throws Exception
	 */
	public void prepare(List<Equipo> equipos, Boolean idavuelta) throws Exception {

		switch (equipos.size()) {
		case 32:
			setCantRondas(5);
			break;
		case 16:
			setCantRondas(4);
			break;
		case 8:
			setCantRondas(3);
			break;
		case 4:
			setCantRondas(2);
			break;
		case 2:
			setCantRondas(1);
			break;
		default:
			setCantRondas(0);
			break;
		}

		if ((equipos.size() % 2 != 0)) {
			throw new Exception("Error: cantidad de equipos impar.");
		}
		rondas.add(prepareFixture(equipos));
		setFechaActual(0);
		setRondaJugadas(0);
		// Armar posiciones
	}

	/**
	 * 
	 * @param equipos
	 * @return
	 */
	private Fixture prepareFixture(List<Equipo> equipos) {
		// Crea el fix y las fechas
		Fixture fix = new Fixture();
		Fecha fecha = new Fecha();
		// Lista de partidos para las fechas
		List<Partido> partidos = new ArrayList<Partido>(0);
		// Crea los partidos
		for (int total = 0; total < equipos.size() / 2; total++) {
			Partido partido = new Partido();
			partido.setLocal(equipos.get(total));
			partido.setVisitante(equipos.get(equipos.size() - total - 1));
			partidos.add(partido);
		}
		// Valores para fecha ida
		fecha.setIdFecha(1);
		fecha.setPartidos(partidos);
		// Agrega las fechas al fixture
		List<Fecha> fechas = new ArrayList<Fecha>();
		fechas.add(fecha);
		fix.setFechas(fechas);
		// Devuelvo el fix
		return fix;
	}

	public boolean finalizada() {
		if (cantRondas.equals(0)) {
			return true;
		}
		return false;
	}

	public Integer getIdEdicion() {
		return idEdicion;
	}

	public void setIdEdicion(Integer idEdicion) {
		this.idEdicion = idEdicion;
	}

	public List<Posicion> getEquipos() {
		return equipos;
	}

	public void setEquipos(List<Posicion> equipos) throws Exception {
		this.equipos = equipos;
	}

	public void jugarFechaActual() {
		Fixture fixActual = rondas.get(getRondaJugadas());
		fixActual.jugarFechaActual();
		finalizeRonda();
	}

	private void finalizeRonda() {
		Fixture fixActual = rondas.get(getRondaJugadas());
		Fecha fecha = fixActual.getFecha(0);

		List<Equipo> equiposGanadores = new ArrayList<Equipo>();

		// Clasificados
		EliminatoriaClasificacionSimple ecs = new EliminatoriaClasificacionSimple();
		for (Partido partido : fecha.getPartidos()) {
			ecs.setPartido(partido);
			equiposGanadores.add(ecs.getGanador());
		}
		setRondaJugadas(getRondaJugadas() + 1);
		if (!edicionFinalizada()) {
			getRondas().add(prepareFixture(equiposGanadores));
		}

	}

	public Boolean edicionFinalizada() {
		if (getCantRondas() <= getRondaJugadas()) {
			return true;
		}
		return false;
	}

	public Integer getCantRondas() {
		return cantRondas;
	}

	public void setCantRondas(Integer cantRondas) {
		this.cantRondas = cantRondas;
	}

	public Integer getFechaActual() {
		return fechaActual;
	}

	public void setFechaActual(Integer fechaActual) {
		this.fechaActual = fechaActual;
	}

	public Integer getRondaJugadas() {
		return rondaJugadas;
	}

	public void setRondaJugadas(Integer rondaJugadas) {
		this.rondaJugadas = rondaJugadas;
	}

	public List<Fixture> getRondas() {
		return rondas;
	}

	public void setRondas(List<Fixture> rondas) {
		this.rondas = rondas;
	}
}